import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author Sangww
 * @date 2024/08/13
 */
public class Demo {

    /**
     * @param args the input arguments
     */
    public static void main(String[] args) {
        //生成100个学生对象
        List<Student> studentList =new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Student student = new Student();
            populateData(student);
            studentList.add(student);
        }

//        //排序1
//        // 使用冒泡排序对 studentList 根据 age 进行排序
//        bubbleSortByAge(studentList,true);
//        System.out.println(studentList);
//
//        //排序2
//        //java8 lambda表达式排序  .reversed()去掉就是正序
//        studentList.sort(Comparator.comparing(Student::getAge).reversed());
//        System.out.println(studentList);
//
//        //分组1
//        // 使用 Java 8 的流 API 对 studentList 根据 age 进行分组
//        Map<Integer, List<Student>> collect = studentList.stream()
//                .collect(Collectors.groupingBy(Student::getAge));
//        System.out.println(collect);

        //分组2
//        Map<Integer, List<Student>> ageGroupMap = groupByAge(studentList);
        Map<String, List<Student>> ageGroupMap = groupByAgeStr(studentList);
        System.out.println(ageGroupMap);
    }

    private static String getKey(Student student) {
        int age = student.getAge();
        if (age<=18) {
            return "小屁孩儿未成年";
        }else if (age<=50) {
            return "永远18";
        }else if (age<=98) {
            return "有退休金了";
        }
        return "飞升了";
    }


    /**
     * @param studentList 需要分组的数据源
     * @return {@link Map }<{@link String }, {@link List }<{@link Student }>>
     */// 手动实现根据 age 分组的逻辑
    public static Map<String, List<Student>> groupByAgeStr(List<Student> studentList) {
        Map<String, List<Student>> ageGroupMap = new HashMap<>();
        for (Student student : studentList) {
            String key = getKey(student);
            if (!ageGroupMap.containsKey(key)) {
                // 如果不存在，则创建一个新的列表
                ageGroupMap.put(key, new ArrayList<>());
            }
            // 将学生添加到对应的列表中
            ageGroupMap.get(key).add(student);
        }
        return ageGroupMap;
    }


        /**
         * @param studentList 需要分组的数据源
         * @return {@link Map }<{@link Integer }, {@link List }<{@link Student }>>
         */// 手动实现根据 age 分组的逻辑
        public static Map<Integer, List<Student>> groupByAge(List<Student> studentList) {
            Map<Integer, List<Student>> ageGroupMap = new HashMap<>();
            for (Student student : studentList) {
            Integer age = student.getAge();
            // 检查 age 是否已经存在于 map 中
            if (!ageGroupMap.containsKey(age)) {
                // 如果不存在，则创建一个新的列表
                ageGroupMap.put(age, new ArrayList<>());
            }
            // 将学生添加到对应的列表中
            ageGroupMap.get(age).add(student);
        }
        return ageGroupMap;
    }

    /**
     * @param list 数据源头
     * @param ascending 正反序
     */// 使用冒泡排序算法根据 age 对学生列表进行排序
    public static void bubbleSortByAge(List<Student> list, boolean ascending) {
        int n = list.size();
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                boolean condition = ascending
                        ? list.get(j).getAge() > list.get(j + 1).getAge()
                        : list.get(j).getAge() < list.get(j + 1).getAge();

                if (condition) {
                    // 交换两个元素的位置
                    Student temp = list.get(j);
                    list.set(j, list.get(j + 1));
                    list.set(j + 1, temp);
                }
            }
        }
    }

    /**
     * @param obj 需要反射的对象
     */// 填充数据
    public static void populateData(Object obj) {
        Random random = new Random();
        for (Field field : obj.getClass().getDeclaredFields()) {
            field.setAccessible(true); // 允许访问私有字段
            if (field.getType().equals(String.class)) {
                try {
                    field.set(obj, "Name_" + random.nextInt(100));
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            } else if (field.getType().equals(Integer.class)) {
                try {
                    field.set(obj, random.nextInt(100));
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


